package com.dong.es.entity.searchparam;

import co.elastic.clients.elasticsearch.core.SearchRequest;
import com.dong.es.entity.EsBaseDTO;

import java.io.Serializable;

/**
 * 该类为ES查询参数的基类，是作为添加ES查询参数使用的，使用方法；
 *      使用 {@link EsSearchParam#addTo} 添加，将参数添加到 {@link EsBaseDTO} 对象
 *      {@link EsBaseDTO} 对象会调用 {@link EsBaseDTO#generator} 生成对应的 {@link SearchRequest.Builder}
 *      {@link EsBaseDTO#generator} 方法中使用 {@link EsSearchParam#loadTo} 方法装载参数条件
 *
 * 例子：
 *      new EsIndexParam(EsIndexConst.INDEX_WXFACE_LOG.value()).addTo(this);
 *
 * @description: ES查询参数 基类
 * @author: 陈瑞东
 * @create: 2022-06-23 10:04
 */
public abstract class EsSearchParam<T> implements Serializable {

    private static final long serialVersionUID = 7602375337054252889L;

    /**
     * 添加至esBaseDTO
     * @param esBaseDTO
     */
    public final void addTo(EsBaseDTO esBaseDTO) {
        if (valid(esBaseDTO)) {
            addMethod(esBaseDTO);
        }
    }

    /**
     * 设置至esBaseDTO
     * @param esBaseDTO
     */
    public final void setTo(EsBaseDTO esBaseDTO) {
        if (valid(esBaseDTO)) {
            setMethod(esBaseDTO);
        }
    }

    /**
     * 校验方法
     */
    protected abstract boolean valid(EsBaseDTO esBaseDTO);

    /**
     * 子类实现的添加方法
     * @param esBaseDTO
     */
    protected abstract void addMethod(EsBaseDTO esBaseDTO);

    /**
     * 子类实现的设置方法
     * @param esBaseDTO
     */
    protected void setMethod(EsBaseDTO esBaseDTO){}

    /**
     * 装载参数至 SearchRequest.Builder
     */
    public abstract void loadTo(T target);

}
